/**
 * N*N的方格，其中只有一格是黑的，其余全白。现在要求用L型将恰好将白格完全盖住且没有覆盖黑格。
 * L型格子的两臂长度以及朝向均可自定。
 * 直接选择某个白角且对应行列均白，放一个L
 * 则剩下的图形变成(N-1)*(N-1)的正方形且仍然只含有一个黑格
 * 变成了一格规模更小的问题。
 * 递归和迭代都行
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using Real = double;
using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;

int N, X, Y;

int Top, Bot, Left, Right;
vector<array<int, 4>> Ans;


void f(){
    if(Top < X){
        if(Left < Y){
            Ans.push_back({Top, Left, Bot - Top, Right - Left});
            ++Top; ++Left;
        }else{
            assert(Right > Y);
            Ans.push_back({Top, Right, Bot - Top, Left - Right});
            ++Top; --Right;
        }
    }else{
        assert(Bot > X);
        if(Left < Y){
            Ans.push_back({Bot, Left, Top - Bot, Right - Left});
            --Bot; ++Left;
        }else{
            assert(Right > Y);
            Ans.push_back({Bot, Right, Top - Bot, Left - Right});
            --Bot; --Right;
        }
    }
    return;
}

void proc(){
    Ans.clear(); Ans.reserve(N + N);

    Top = Left = 1;
    Bot = Right = N;
    while(1){
        if(Top == Bot and Left == Right){
            assert(X == Top and Y == Left);
            break;
        }

        f();
    }      

    cout << "Yes\n" << Ans.size() << "\n";
    for(const auto & p : Ans) cout << p[0] << " " << p[1] << " " << p[2] << " " << p[3] << "\n";
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofakse = 1;
    // cin >> nofakse;
    while(nofakse--){
        cin >> N >> X >> Y;
        proc();
    }
    return 0;
}